#include "WebServer.h"
#include "WiFi.h"
#include "htmlpage.h"    //存储网页
#include "Preferences.h" //往flash里面存入数据

//该串口可以重定向到其它引脚

WebServer server(80);    // 创建服务器对象监听80端口
Preferences preferences; // 创建flash对象
String pid_all_data;

void PID_store(String &str)
{
  int index = str.indexOf('/');
  String pidx = str.substring(0, index);       // 获取pid字符串
  String pid_value = str.substring(index + 1); // 获取pid参数
  int max_pidindex = pidx.substring(3).toInt();

  preferences.begin("storage");                   // 往flash中写数据,记录下你的pid参数
  preferences.putString(pidx.c_str(), pid_value); // 写入数据

  int now_pidindex = preferences.getInt("max_pid", -1);
  if (now_pidindex < max_pidindex)
  {                                              // 如果最大值小那么就记录下来
    preferences.putInt("max_pid", max_pidindex); // 记录下最大的数字
  }
  preferences.end(); // 关闭命名空间
}

void PID_flash_get(String &str)
{
  preferences.begin("storage", 1);                      // 读取数据
  int index_of_pid = preferences.getInt("max_pid", -1); // 获取现在设置的pid数量有多少
  for (int i = 1; i <= index_of_pid; i++)               // 遍历所有的pid设置
  {                                                     // 遍历数组
    String key = "pid" + String(i);
    String pidvalue = preferences.getString(key.c_str(), "P:0,I:0,D:0");
    str += key + "/" + pidvalue;
  }
  // Serial.println(index_of_pid);//debug()
  preferences.end();
}

void setup()
{
  Serial.begin(115200);
  WiFi.softAP("ESP32C3_PID_CTR");
  // WiFi.setTxPower(WIFI_POWER_19_5dBm);  // 设置为最大功率

  // 获取pid历史记录
  server.on("/get_pid_store", HTTP_GET, []()
            {
              PID_flash_get(pid_all_data);
              // Serial.println(pid_all_data);//debug()
              server.send(200, "text/html", pid_all_data); 
              pid_all_data.clear();//清除数据
            }); // 给浏览器解析数据
  // 主路由发送数据
  server.on("/", HTTP_GET, []()
            { server.send(200, "text/html", String(htmlPage)); });

  // 心跳检测路由
  server.on("/heartbeat", HTTP_GET, []()
            { server.send(200, "text/plain", "ok"); });
  // 清除历史记录路由
  server.on("/pid_clear", HTTP_GET, []()
            { 
              if(preferences.begin("storage")){
                preferences.clear();
                preferences.end();
                server.send(200, "text/plain","ok"); 
              }
              server.send(200, "text/plain","本来就没有数据"); });
  server.on("/pid_commit", HTTP_POST, []()
            {
    String receivedData = server.arg("plain");//获取数据
    PID_store(receivedData);//存储PID数据

    Serial.println(receivedData);//串口发送数据
    server.send(200, "text/plain", "数据已接收"); });

  server.begin(); // 开启服务
  // Serial0.begin(115200, SERIAL_8N1, 21, 20);//使用其它串口
}

void loop()
{
  server.handleClient(); // 开启网页服务
  delay(1);//降低功耗
  // Serial.println(pid_all_data);
  //  Serial0.println("helloworld");//使用其它串口
}
